package com.sx.service.serviceImpl;

import com.sx.dao.GoodRecordDao;
import com.sx.dao.daoImpl.GoodDaoImpl;
import com.sx.dao.daoImpl.GoodRecordDaoImpl;
import com.sx.pojo.Goods;
import com.sx.pojo.GoodsOpRecords;
import com.sx.pojo.GoodsStock;
import com.sx.pojo.OptionRecords;
import com.sx.service.GoodService;
import com.sx.service.OptionRecordService;

import javax.swing.text.html.Option;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class GoodServiceImpl implements GoodService {
    GoodDaoImpl goodDao = new GoodDaoImpl();

    GoodRecordDao goodRecordDao = new GoodRecordDaoImpl();
    OptionRecordService optionRecordService = new OptionRecordServiceImpl();

    @Override
    public ArrayList<Goods> getAllGoods() {
        return goodDao.getAllGoods();
    }

    @Override
    public boolean checkIdExists(String id) {
        return goodDao.checkIdExists(id);
    }

    /**
     * 保存商品信息，并记录操作痕迹
     *
     * @param goods      商品对象，包含商品的详细信息
     * @param PersonId   操作人的ID，用于记录操作痕迹
     * @param PersonName 操作人的姓名，用于记录操作痕迹
     * @param flag       操作标志，表示操作的类型或状态
     * @param type       操作类型，区分不同的操作行为
     * @param id         商品ID，用于标识特定的商品
     * @return 保存商品信息的成功与否，成功返回true，否则返回false
     */
    public boolean saveGood(Goods goods, String PersonId, String PersonName, int flag, int type, String id) {
        // 创建操作记录对象，用于记录商品操作前后的状态
        OptionRecords optionRecords = new OptionRecords();
        optionRecords.setPersonId(PersonId);
        optionRecords.setPersonName(PersonName);
        // 设置操作前的商品状态，通过商品ID查询并转换为字符串
        optionRecords.setBeOption(null);
        // 设置操作后的商品状态，即当前商品对象的状态
        optionRecords.setAfOption(goods.toString());
        // 设置操作标志，用于区分不同的操作类型
        optionRecords.setFlag(flag);
        // 设置操作表，用于区分不同的操作表
        optionRecords.setType(type);
        // 调用商品DAO的保存方法，尝试保存商品信息
        if (goodDao.saveGood(goods)) {
            // 如果保存成功，记录操作痕迹，包括操作人信息、操作前后商品状态、操作标志和类型
            optionRecordService.addOptionRecord(optionRecords.getPersonId(), optionRecords.getPersonName(), optionRecords.getBeOption(), optionRecords.getAfOption(), optionRecords.getFlag(), optionRecords.getType());
            return true;
        } else {
            // 如果保存失败，返回false
            return false;
        }
    }

    @Override
    public Goods getGoodById(String id) {
        return goodDao.getGoodById(id);
    }

    /**
     * 删除商品ById，并记录操作
     * 此方法扩展了简单的商品删除功能，增加了操作记录的保存步骤
     * 它创建一个OptionRecords对象来记录操作前后的情况，并调用goodDao删除商品
     * 如果删除成功，它将调用optionRecordService添加操作记录
     *
     * @param PersonId   操作人的ID，用于记录是谁进行了删除操作
     * @param PersonName 操作人的名称，用于更直观地显示操作者信息
     * @param flag       操作标志，表示操作的类型或状态
     * @param id         商品ID，标识要删除的商品
     * @param type       操作类型，进一步描述操作的性质
     * @return boolean 表示商品是否删除成功
     */
    public boolean deleteGoodById(String PersonId, String PersonName, int flag, String id, int type) {
        // 创建一个OptionRecords对象来记录这次操作
        OptionRecords optionRecords = new OptionRecords();
        // 设置被操作的商品信息，这里利用goodDao获取商品信息并转换为字符串
        optionRecords.setBeOption(goodDao.getGoodById(id).toString());
        // 设置操作后的状态，此处为空字符串，表示商品已被删除
        optionRecords.setAfOption(null);
        // 设置操作人的ID
        optionRecords.setPersonId(PersonId);
        // 设置操作人的名称
        optionRecords.setPersonName(PersonName);
        // 设置操作标志
        optionRecords.setFlag(flag);
        // 设置操作类型
        optionRecords.setType(type);
        // 尝试通过goodDao删除商品
        if (goodDao.deleteGoodById(id)) {
            // 如果删除成功，记录这次操作
            optionRecordService.addOptionRecord(optionRecords.getPersonId(), optionRecords.getPersonName(), optionRecords.getBeOption(), optionRecords.getAfOption(), optionRecords.getFlag(), optionRecords.getType());
            // 返回成功标志
            return true;
        } else {
            // 如果删除失败，返回失败标志
            return false;
        }
    }

    @Override
    public boolean updateGood(Goods goods) {
        return goodDao.updateGood(goods);
    }

    /*@Override
    public boolean updateGood(Goods goods) throws SQLException {
        return goodDao.updateGood(goods);
    }*/
    public boolean updateGood(Goods goods, String PersonId, String personName, int flag, int type, String id) {
        OptionRecords optionRecords = new OptionRecords();
        optionRecords.setBeOption(goodDao.getGoodById(id).toString());
        optionRecords.setAfOption(goods.toString());
        optionRecords.setPersonId(PersonId);
        optionRecords.setPersonName(personName);
        optionRecords.setFlag(flag);
        optionRecords.setType(type);
        if (goodDao.updateGood(goods)) {
            optionRecordService.addOptionRecord(optionRecords.getPersonId(), optionRecords.getPersonName(), optionRecords.getBeOption(), optionRecords.getAfOption(), optionRecords.getFlag(), optionRecords.getType());
            return true;
        } else {
            return false;
        }
    }

    @Override
    public List<Goods> searchGoods(String categoryId, String numberOrder, String shelfLifeOrder, String priceOrder, String supplierId) {
        return goodDao.searchGoods(categoryId, numberOrder, shelfLifeOrder, priceOrder, supplierId);
    }


    /*@Override
    public List<Goods> searchGoods(Integer categoryId, String numberOrder, String shelfLifeOrder, String priceOrder, Integer supplierId) {
        return goodDao.searchGoods(categoryId, numberOrder, shelfLifeOrder, priceOrder, supplierId);
    }*/

    /*@Override
    public List<Goods> searchGoods(Integer categoryId, Integer number, String shelfLifeOrder, String priceOrder, Integer supplierId) {
        return goodDao.searchGoods(categoryId, number, shelfLifeOrder, priceOrder, supplierId);
    }
*/
    /*@Override
    public List<Goods> searchGoods(Integer categoryId, Float minPrice, Float maxPrice, Integer number, Integer remainingShelfLife, Integer supplierId, String keyword) {
        return goodDao.searchGoods(categoryId, minPrice, maxPrice, number, remainingShelfLife, supplierId, keyword);
    }*/

    @Override
    public ArrayList<GoodsStock> findByName(String name) {
        return goodDao.findByName(name);
    }

    @Override
    public ArrayList<GoodsOpRecords> getAllGoodRecords() {
        return goodRecordDao.getAllGoodRecords();
    }
}
